// ----------------------------
// <start.c>
//				Jack Zheng
//				3112490969@qq.com
// ----------------------------
#include "type.h"
#include "stdio.h"
#include "const.h"
#include "protect.h"
#include "string.h"
#include "fs.h"
#include "proc.h"
#include "tty.h"
#include "console.h"
#include "global.h"
#include "proto.h"

PUBLIC void cstart()
{
	/* 将 LOADER 中的 GDT 复制到新的 GDT 中 */
	memcpy(&gdt,							  /* New GDT */
		   (void *)(*((u32 *)(&gdt_ptr[2]))), /* Base  of Old GDT */
		   *((u16 *)(&gdt_ptr[0])) + 1		  /* Limit of Old GDT */
	);
	/* gdt_ptr[6] 共 6 个字节：0~15:Limit  16~47:Base。用作 sgdt 以及 lgdt 的参数。 */
	u16 *p_gdt_limit = (u16 *)(&gdt_ptr[0]);
	u32 *p_gdt_base = (u32 *)(&gdt_ptr[2]);
	*p_gdt_limit = GDT_SIZE * sizeof(struct descriptor) - 1;
	*p_gdt_base = (u32)&gdt;

	/* idt_ptr[6] 共 6 个字节：0~15:Limit  16~47:Base。用作 sidt 以及 lidt 的参数。 */
	u16 *p_idt_limit = (u16 *)(&idt_ptr[0]);
	u32 *p_idt_base = (u32 *)(&idt_ptr[2]);
	*p_idt_limit = IDT_SIZE * sizeof(struct gate) - 1;
	*p_idt_base = (u32)&idt;

	init_prot();

	struct boot_params _bp;
	get_boot_params(&_bp);
	disp_pos = _bp.disp_pos * 2;
	// 死办法 ...
	disp_str("\n");
}
